import sys


# 账务列表
ierecords = [
    ['吃饭支出', '交通银行', '247.0', '2016-03-02', '家庭聚餐'],
    ['工资收入', '现金', '12345.0', '2016-03-15', '开工资了'],
    ['服装支出', '现金', '1998.0', '2016-04-02', '买衣服'],
    ['吃饭支出', '现金', '325.0', '2016-06-18', '朋友聚餐'],
    ['股票收入', '工商银行', '8000.0', '2016-10-28', '股票大涨'],
    ['股票收入', '工商银行', '5000.0', '2016-10-28', '股票又大涨'],
    ['工资收入', '交通银行', '5000.0', '2016-10-28', '又开工资了'],
    ['礼金支出', '现金', '5000.0', '2016-10-28', '朋友结婚'],
    ['其他支出', '现金', '1560.0', '2016-10-29', '丢钱了'],
    ['交通支出', '交通银行', '2300.0', '2016-10-29', '油价还在涨啊'],
    ['吃饭支出', '工商银行', '1000.0', '2016-10-29', '又吃饭'],
    ['工资收入', '现金', '1000.0', '2016-10-30', '开资'],
    ['交通支出', '现金', '2000.0', '2016-10-30', '机票好贵'],
    ['工资收入', '现金', '5000.0', '2016-10-30', '又开资']
]


# 定义一般用户登录后的功能，是个方法，可以在其他地方被调用
def ordinary_user():
    # 这个循环的作用是让用户在使用（1.查询所有  2.按条件查询）这两个功能的其中一个功能后，不会直接退出系统，可以选择另一个功能使用
    while True:
        # 打印提示信息
        print("1.查询所有  2.按条件查询：", end='')
        # 选择功能
        num = input()
        # 选择了查询所有功能
        if num == '1':
            # 这个循环的作用是让用户可以在查询所有之后能快捷地再次查询所有，而不用再次输入1
            while True:
                # 格式化打印提示信息
                print('{:<10}{:<10}{:<10}{:<10}{:<10}{:<10}'.format('ID', '类别', '账户', '金额', '时间', '说明', chr(12288)))
                # begin 用于自动生成ID
                begin = 0
                # 循环打印总账务列表内的全部子列表信息
                for i in ierecords:
                    begin += 1
                    print(
                        # begin是ID
                        '{:<10}{:<10}{:<10}{:<10}{:<10}{:<10}'.format(begin, i[0], i[1], i[2], i[3], i[4], chr(12288)))
                # 询问是否要再次查询所有信息
                continue_flag = input('你是否要继续进行查询？（yes/no）：')
                if continue_flag != 'yes':
                    break
            # 询问是否要退出查询（包括查询所有和条件查询），下面使用相同语句的地方作用是相同的
            exit_flag = input('你想要退出吗？(yes/no)：')
            if exit_flag == 'yes':
                # 这里return 作用不是为了返回某个值，而是为了返回调用这个方法的地方，使用return不使用sys.exit(
                # )是因为如果在管理员方法中调用这个函数时，退出这个模块不会导致整个系统的退出，下面使用return的地方同理
                return
        # 选择了按条件查询功能
        elif num == '2':
            # 打印提示信息，条件可以选择以下几类：
            print('1.ID    2.类别    3.账户    4.金额    5.时间    6.说明')
            number = input("请选择你要使用的筛选条件（输入序号）：")
            # 选择ID作为查询条件，这时只需要打印出一条数据（毕竟ID就一个）
            if number == '1':
                # 这个循环的作用是在用户使用ID查询一次后能直接继续使用ID进行查询，而不用再次选择('1.ID 2.类别 3.账户 4.金额 5.时间 6.说明')这些查询条件
                while True:
                    # 打印现在可以选择的ID，提示用户不要输入在此之外的数字，当然ta非要输错也有提示信息
                    for i in range(1, len(ierecords) + 1):
                        print(i, end='\t')
                    condition = input("请输入账务ID：")
                    # 判断输入的数据是否可以转化为整数，并且在正常范围之内
                    if condition.isdigit() and 1 <= int(condition) <= len(ierecords):
                        print("正为您打印 ", condition, ' 的收支记录，如没有打印任何记录，代表没有此项收支记录。')
                        # 这里的condition即代表ID，ID - 1即为所要查询的子列表的在ierecords这个大列表中所在的序号，
                        # 下面的ierecords[int(condition) - 1]就找到了子列表的位置
                        print(f'{int(condition)}    {ierecords[int(condition) - 1][0]}    {ierecords[int(condition) - 1][1]}    {ierecords[int(condition) - 1][2]}    {ierecords[int(condition) - 1][3]}    {ierecords[int(condition) - 1][4]}')
                    # 如果输入的数据不能转化为整数或者不在正常范围之内，就提示ta输错了
                    else:
                        print('没有这种收支类别！')
                    # 询问是否要继续使用ID进行查询
                    continue_flag = input('你是否要继续进行查询？（yes/no）：')
                    if continue_flag != 'yes':
                        break
                exit_flag = input('你想要退出吗？(yes/no)：')
                if exit_flag == 'yes':
                    return
            # 选择类别作为查询条件，因为可能有多条账务的类别相同，所以此项需要使用循环找出并打印所有类别正确的账务信息
            elif number == '2':
                # 这个循环的作用是在用户使用类别查询一次后能直接继续使用类别进行查询，而不用再次选择('1.ID 2.类别 3.账户 4.金额 5.时间 6.说明')这些查询条件
                while True:
                    # 首先打印现有账务中的所有类别
                    conditions = []
                    # 这个循环的作用是去重
                    for i in ierecords:
                        if i[1] not in conditions:
                            conditions.append(i[1])
                    # 打印类别
                    for i in conditions:
                        print(i, end=' ')
                    condition = input("请输入收支类别：")
                    # 判断用户输入的类别是否在现有账务中存在，如果在就打印信息
                    if condition in conditions:
                        print("正为您打印 ", condition, ' 的收支记录，如没有打印任何记录，代表没有此项收支记录。')
                        # begin是序号
                        begin = 0
                        for j in ierecords:
                            begin += 1
                            if j[1] == condition:
                                # 使用序号表明类别正确的账务在总帐务中的位置，之后进行打印
                                print(f'{begin}    {j[0]}    {j[1]}    {j[2]}    {j[3]}    {j[4]}')
                    # 如果用户输入的类别在现有账务中不存在，就提示ta输错了
                    else:
                        print('没有这种收支类别！')
                    # 询问是否进行使用类别作为查询条件
                    continue_flag = input('你是否要继续进行查询？（yes/no）：')
                    if continue_flag != 'yes':
                        break
                # 询问是否要退出查询（包括查询所有和条件查询）
                exit_flag = input('你想要退出吗？(yes/no)：')
                if exit_flag == 'yes':
                    # 这里return 作用不是为了返回某个值，而是为了返回调用这个方法的地方，使用return不使用sys.exit(
                    # )是因为如果在管理员方法中调用这个函数时，退出这个模块不会导致整个系统的退出，下面使用return的地方同理
                    return
            # 选择使用账户作为查询条件，由于除了ID以为的信息都为字符串格式，所以除ID意外的查询流程过程都一样，只是提示信息做了稍微修改
            elif number == '3':
                while True:
                    conditions = []
                    for i in ierecords:
                        if i[2] not in conditions:
                            conditions.append(i[2])
                    for i in conditions:
                        print(i, end=' ')
                    condition = input("请输入账户类别：")
                    if condition in conditions:
                        print("正为您打印 ", condition, ' 的收支记录，如没有打印任何记录，代表没有此项收支记录。')
                        begin = 0
                        for j in ierecords:
                            begin += 1
                            if j[2] == condition:
                                print(f'{begin}    {j[0]}    {j[1]}    {j[2]}    {j[3]}    {j[4]}')
                    else:
                        print('没有这种收支类别！')
                    continue_flag = input('你是否要继续进行查询？（yes/no）：')
                    if continue_flag != 'yes':
                        break
                exit_flag = input('你想要退出吗？(yes/no)：')
                if exit_flag == 'yes':
                    return
            elif number == '4':
                while True:
                    conditions = []
                    for i in ierecords:
                        if i[3] not in conditions:
                            conditions.append(i[3])
                    for i in conditions:
                        print(i, end=' ')
                    condition = input("请输入金额数目：")
                    if condition in conditions:
                        print("正为您打印 ", condition, ' 的收支记录，如没有打印任何记录，代表没有此项收支记录。')
                        begin = 0
                        for j in ierecords:
                            begin += 1
                            if j[3] == condition:
                                print(f'{begin}    {j[0]}    {j[1]}    {j[2]}    {j[3]}    {j[4]}')
                    else:
                        print('没有这种收支类别！')
                    continue_flag = input('你是否要继续进行查询？（yes/no）：')
                    if continue_flag != 'yes':
                        break
                exit_flag = input('你想要退出吗？(yes/no)：')
                if exit_flag == 'yes':
                    return
            elif number == '5':
                while True:
                    conditions = []
                    for i in ierecords:
                        if i[4] not in conditions:
                            conditions.append(i[4])
                    for i in conditions:
                        print(i, end=' ')
                    condition = input("请输入收支时间：")
                    if condition in conditions:
                        print("正为您打印 ", condition, ' 的收支记录，如没有打印任何记录，代表没有此项收支记录。')
                        begin = 0
                        for j in ierecords:
                            begin += 1
                            if j[4] == condition:
                                print(f'{begin}    {j[0]}    {j[1]}    {j[2]}    {j[3]}    {j[4]}')
                    else:
                        print('没有这种收支类别！')
                    continue_flag = input('你是否要继续进行查询？（yes/no）：')
                    if continue_flag != 'yes':
                        break
                exit_flag = input('你想要退出吗？(yes/no)：')
                if exit_flag == 'yes':
                    return
            elif number == '6':
                while True:
                    conditions = []
                    for i in ierecords:
                        if i[5] not in conditions:
                            conditions.append(i[5])
                    for i in conditions:
                        print(i, end=' ')
                    condition = input("请输入收支说明：")
                    if condition in conditions:
                        print("正为您打印 ", condition, ' 的收支记录，如没有打印任何记录，代表没有此项收支记录。')
                        begin = 0
                        for j in ierecords:
                            begin += 1
                            if j[5] == condition:
                                print(f'{begin}    {j[0]}    {j[1]}    {j[2]}    {j[3]}    {j[4]}')
                    else:
                        print('没有这种收支类别！')
                    continue_flag = input('你是否要继续进行查询？（yes/no）：')
                    if continue_flag != 'yes':
                        break
                exit_flag = input('你想要退出吗？(yes/no)：')
                if exit_flag == 'yes':
                    return


# 定义管理员登录后的功能，是个方法，可以被调用
def administrator():
    # 打印提示信息，用于和一般用户登录做区别
    print('你已登入管理员账户！')
    # 这个循环的作用是让管理员在操作某一个功能('1.添加账务 2.编辑账务 3.删除账务 4.查询账务 5.退出系统'中的的一个）后，
    # 系统不会直接退出，而是询问用户是否继续使用，使用户感到更舒服
    while True:
        print('1.添加账务    2.编辑账务    3.删除账务    4.查询账务    5.退出系统')
        num = input('请输入要操作的功能序号[1-5]：')
        # 选择的 添加账务 功能
        if num == '1':
            # 这个循环的作用是让用户在添加完一个账务后可以直接再添加账务，而不用到选择功能界面
            while True:
                # 打印出原有所有账务，方便确认添加是否成功
                print('原有所有账务信息：')
                print('ID    类别    账户    金额    时间    说明')
                # begin是序号
                begin = 0
                for i in ierecords:
                    begin += 1
                    # 使用序号进行定位查询
                    print(f'{begin}    {i[0]}    {i[1]}    {i[2]}    {i[3]}    {i[4]}')
                # 输入新的账务的信息，ID不用输入，系统自动生成
                specie = input('请输入账务类别：')
                account = input('请输入账务账户：')
                amount = input('请输入账务金额：')
                t = input('请输入账务时间：')
                instruction = input('请输入账务说明：')
                # 新建一个账务列表
                accounting = [specie, account, amount, t, instruction]
                # 将新建的账务列表添加到所有账务列表中
                ierecords.append(accounting)
                # 打印添加完成的所有账务信息，与添加前的账务信息做对比，验证添加是否成功
                print('添加后的所有账务信息：')
                print('ID    类别    账户    金额    时间    说明')
                begin = 0
                for i in ierecords:
                    begin += 1
                    print(f'{begin}    {i[0]}    {i[1]}    {i[2]}    {i[3]}    {i[4]}')
                # 询问是否要继续进行添加
                continue_flag = input('你是否要继续进行添加？（yes/no）：')
                if continue_flag != 'yes':
                    break
            # 询问用户是否直接退出系统，不再进行任何操作
            exit_flag = input('你想要退出系统吗？(yes/no)：')
            if exit_flag == 'yes':
                # 对于这个程序来说，这里也可以使用return
                # 注：return 的作用是返回调用这个方法的地方，从那个地方继续向下执行，而sys.exit()是直接在这个地方终止程序运行
                sys.exit()
        # 选择 编辑账务 功能
        elif num == '2':
            # 这个循环的作用是让用户在编辑完一个账务后可以直接再次编辑账务，而不用到选择功能界面
            while True:
                # 本次使用账务ID定位到要修改的账务，实际也可以使用其他信息进行定位，不过可能会复杂一些
                # ID肯定只会定位到一条账务，而其他方式可能会定位到多条账务
                id = int(input('请输入账务ID：'))
                # 打印修改前的账务的信息
                print('账务原始信息如下：')
                print(
                    f'{id}    {ierecords[id - 1][0]}    {ierecords[id - 1][1]}    {ierecords[id - 1][2]}    {ierecords[id - 1][3]}    {ierecords[id - 1][4]}')
                # 选择要修改账务中的哪个信息
                number = input('请选择你想修改的信息：（1.类别  2.账户  3.金额  4.时间  5.说明）：')
                if number.isdigit() and int(number) >= 1 and int(number) <= 5:
                    # 使用赋值进行修改
                    if number == '1':
                        specie = input('请输入修改后的类别：')
                        ierecords[id - 1][1] = specie
                    elif number == '2':
                        account = input('请输入修改后的账户：')
                        ierecords[id - 1][2] = account
                    elif number == '3':
                        amount = input('请输入修改后的金额：')
                        ierecords[id - 1][3] = amount
                    elif number == '4':
                        t = input('请输入修改后的时间：')
                        ierecords[id - 1][4] = t
                    elif number == '5':
                        instruction = input('请输入修改后的说明：')
                        ierecords[id - 1][5] = instruction
                    # 打印修改后的账务信息，验证修改是否成功
                    print('修改后的账务信息如下：')
                    print(
                        f'{id}    {ierecords[id - 1][0]}    {ierecords[id - 1][1]}    {ierecords[id - 1][2]}    {ierecords[id - 1][3]}    {ierecords[id - 1][4]}')
                    # 询问是否要继续使用 修改账务 功能
                    continue_flag = input('你是否要继续进行修改？（yes/no）：')
                    if continue_flag != 'yes':
                        break
            # 询问是否要终止程序运行
            exit_flag = input('你想要退出系统吗？(yes/no)：')
            if exit_flag == 'yes':
                sys.exit()
        # 选择 删除账务 功能，这个功能的流程和 修改账务 功能的流程很像，可以参照上面的注释进行理解
        elif num == '3':
            while True:
                id = int(input('请输入账务ID：'))
                print('要删除的账务信息如下：')
                print(
                    f'{id}    {ierecords[id - 1][0]}    {ierecords[id - 1][1]}    {ierecords[id - 1][2]}    {ierecords[id - 1][3]}    {ierecords[id - 1][4]}')
                ierecords.pop(id - 1)
                print('清除账务成功！')
                continue_flag = input('你是否要继续进行删除？（yes/no）：')
                if continue_flag != 'yes':
                    break
            exit_flag = input('你想要退出系统吗？(yes/no)：')
            if exit_flag == 'yes':
                sys.exit()
        # 选择 查询账务 功能，注意到这个功能与一般用户登录后使用的功能完全相同，所以在此处直接调用一般用户的方法
        elif num == '4':
            # 这个循环的作用同上
            while True:
                ordinary_user()
                continue_flag = input('你是否要继续进行查询？（yes/no）：')
                if continue_flag != 'yes':
                    break
            exit_flag = input('你想要退出系统吗？(yes/no)：')
            if exit_flag == 'yes':
                sys.exit()
        # 选择 退出系统
        elif num == '5':
            print('再见！')
            sys.exit()


# 这个句式的作用是在其他.py文件中引入这个.py文件时，句式内的语句不会自动执行，可以减少一些运行的东西
if __name__ == '__main__':
    # 这个循环的作用是让用户在登录失败后可以重新尝试登录，而不会直接退出系统，增强用户体验
    while True:
        name = input('请输入账户名：')
        password = input('请输入密码：')
        if name == 'admin' and password == '123456':
            administrator()
            break
        elif name == 'lisi' and password == '123456':
            ordinary_user()
            break
        else:
            print('账户或密码输入有误！请重新输入。')
